import cv2
import numpy as np
from utils.common import load_image, make_dirs  # 导入公共函数
from utils.config import exp4_output_dir  # 导入输出路径

def region_growing(img, seed, threshold=10):
    """
    区域生长法分割图像
    :param img: 输入灰度图像
    :param seed: 种子点坐标 (x, y)
    :param threshold: 生长阈值
    :return: 分割后的二值图像
    """
    neighbors = [(0, 1), (1, 0), (-1, 0), (0, -1)]  # 4-邻域
    seed_list = [seed]  # 初始化种子点列表
    out_img = np.zeros_like(img)  # 创建输出图像
    out_img[seed] = 255  # 标记种子点

    while seed_list:
        current_point = seed_list.pop(0)  # 取出当前种子点
        current_value = img[current_point]  # 当前种子点的像素值

        for n in neighbors:
            x = current_point[0] + n[0]
            y = current_point[1] + n[1]

            # 检查边界条件
            if 0 <= x < img.shape[0] and 0 <= y < img.shape[1]:
                # 如果像素未被标记且满足阈值条件
                if out_img[x, y] == 0 and abs(int(img[x, y]) - int(current_value)) < threshold:
                    out_img[x, y] = 255  # 标记该像素
                    seed_list.append((x, y))  # 将该像素加入种子列表

    return out_img

def main():
    # 确保输出目录存在
    make_dirs(exp4_output_dir)

    # 加载图片
    image = load_image()  # 使用公共函数加载图像
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像

    # 设置种子点
    seed_point = (100, 100)  # 可以根据需要调整种子点

    # 使用区域生长法分割图像
    segmented_img = region_growing(gray_image, seed_point, threshold=10)  # 调用 region_growing 函数

    # 显示原始图像和分割结果
    cv2.imshow("Original Image", gray_image)
    cv2.imshow("Segmented Image (Region Growing)", segmented_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 保存结果
    cv2.imwrite(f"{exp4_output_dir}/region_growing_result.jpg", segmented_img)

if __name__ == "__main__":
    main()